package cn.sjx.modules.nbiot.entity.send;

import cn.sjx.modules.nbiot.entity.common.AckEnum;
import cn.sjx.modules.nbiot.entity.common.IotProtocolConstants;
import io.netty.buffer.ByteBuf;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 确认报文实体类（0x77）
 * <p>
 * 地磁检测器和占道平台之间存在ACK机制，占道平台会分析地磁检测器的数据报文和心
 * 跳报文信息，并返回对应的确认报文（返回报文批次号必须和接收到的批次号一致），确认
 * 报文格式如下（注：重置地磁的命令仅在接受到心跳包后下达，暂不支持指令重置）
 * </p>
 *
 * @Author: sjx
 * @Date: 2019年08月31日 0031 15:45:12
 */
@Data
@Accessors(chain = true)
public class IotProtocolSend_0x77 extends IotProtocolSendBase {

    /**
     * <p>
     * 字段名称：确认数据
     * 说明：
     * 0x70：确认ACK 成功
     * 0x29: 业务处理未完成，通知检查服务器
     * 0x07：收到同一地磁设备的重复进场数据
     * 0x10：收到同一地磁设备的重复离场数据
     * 0x17：CRC 验证失败
     * 0x24：地磁设备不存在
     * 0x30：未知错误
     * 其他错误
     * 字节：2
     * </p>
     */
    private AckEnum ack;

    /**
     * <p>
     * 字段名称：接收到的批次号
     * 说明：接收到的停车批次号
     * 字节：2
     * </p>
     */
    private short parkCount;

    /**
     * <p>
     * 字段名称：命令字
     * 说明：用于重置（25）
     * 字节：1
     * </p>
     */
    private byte command;

    /**
     * <p>
     * 字段名称：预留
     * 说明：设置地磁参数备用
     * 字节：4
     * </p>
     */
    private int reserverd;

    /**
     * <p>
     * 字段名称：服务器标准时间
     * 说明：时间数字16进制示例为 0x20181030105836 表示2018年10月30日10点58分36秒
     * 字节：7
     * </p>
     */
    private byte[] time;

    public IotProtocolSend_0x77() {
        super(IotProtocolConstants.GEOMAGNETIC_RESPONSE_CONFIRMATION_MESSAGE);
        this.msgBodyLength = 16;
    }

    @Override
    protected void encodeImpl(ByteBuf buf) {
        // 写入确认数据
        buf.writeShort(getAck().getValue());

        // 写入接收到的批次号
        buf.writeShort(getParkCount());

        // 写入命令字
        buf.writeByte(getCommand());

        // 写入预留字段
        buf.writeInt(getReserverd());

        // 写入服务器标准时间
        buf.writeBytes(getTime());
    }
}
